/*
 * FifoProtocoloPlano.cpp
 *
 *  Created on: Sep 19, 2013
 *      Author: gonprieto
 */

#include "FifoProtocoloPlano.h"
#include "../utils/UtilString.h"
#include "../utils/Logger.h"

#define MAX_MESSAGE_SIZE sizeof(unsigned long int)


FifoProtocoloPlano::FifoProtocoloPlano(std::string fifoName) : Fifo(fifoName) {}

FifoProtocoloPlano::~FifoProtocoloPlano() {}

int FifoProtocoloPlano::escribirMensaje(unsigned int idToWrite,Mensaje& Mensaje){
	std::string stream = pp.serializar(Mensaje);

	std::string longMensaje = UtilString::intToString(stream.size());
	std::string tamanioString =UtilString::fixedSize(longMensaje,PLANO_HEADER_MAX_LONG);

	std::string mensajeString = tamanioString + stream;

	//Escribo el mensaje
	return this->escribir(mensajeString.c_str(),mensajeString.size());
}

Mensaje* FifoProtocoloPlano::leerMensaje(unsigned int id){

	char tamanio[PLANO_HEADER_MAX_LONG];
	memset(&tamanio,0,PLANO_HEADER_MAX_LONG);
	tamanio[0]='\0';
	int error = this->leer(tamanio, PLANO_HEADER_MAX_LONG);

	if(error == -1){
		exit(-1);
	}

	//Obtengo la longitud del mensaje que voy a tener que leer de la pila
	std::string longitud = tamanio;
	unsigned long int tamanioAux=UtilString::stringToInt(longitud);

	//Obtengo el mensaje a leer y lo leo
	char* mensaje = new char[tamanioAux + 1];
	int resultado = this->leer(mensaje, tamanioAux);

	//0 es EOF
	//-1 es error
	if ( resultado < 1){
		Logger::getInstance().logMessage(Logger::TRACE, "FifoProtocoloPlano::leerMensaje() :: Guarda.. Posible EOF en , nombre" + this->getNombre());

		if ( resultado == -1){
			Logger::getInstance().logMessage(Logger::ERROR, "FifoProtocoloPlano::leerMensaje() :: Error en la lectura del FIFO , nombre" + this->getNombre());
			perror("read");
		}

		return NULL;
	}

	std::string serializedMensaje;
	serializedMensaje = mensaje;

	return pp.deserializar(serializedMensaje);
}

void FifoProtocoloPlano::cerrar(){
	Fifo::cerrar();
}


